﻿Imports System.Data
Imports MyGeneration.dOOdads
Imports ClassSigeco.ClassSigeco

Public Class controller_compras

    Private _MessageError As Exception = Nothing
    Public Property MessageError() As Exception
        Get
            Return _MessageError
        End Get
        Set(ByVal value As Exception)
            _MessageError = value
        End Set
    End Property

#Region "Proveedores"

    Public Function Insert_Proveedores(ByVal conn As String, ByVal proveedor As String, ByVal direccion As String, ByVal telefono1 As String, ByVal telefono2 As String, _
                                    ByVal ruc As String, ByVal email As String, ByVal codUsuario As Integer) As Integer

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim pro As New ClassSigeco.ClassSigeco.si_proveedor(conn)

            pro.AddNew()
            pro.Proveedor = proveedor
            pro.Direccion = direccion
            pro.Telefono1 = telefono1
            pro.Telefono2 = telefono2
            pro.Email = email
            pro.Ruc = ruc
            pro.Habilitado = True
            pro.ActualizadoPor = codUsuario
            pro.ActualizadoFecha = DateTime.Now
            pro.Save()

            tx.CommitTransaction()

            Return pro.IdProveedor

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Update_Proveedores(ByVal conn As String, ByVal idProveedor As Integer, ByVal proveedor As String, ByVal direccion As String, ByVal telefono1 As String, ByVal telefono2 As String, _
                                    ByVal ruc As String, ByVal email As String, ByVal codUsuario As Integer, ByVal habilitado As Boolean) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim pro As New ClassSigeco.ClassSigeco.si_proveedor(conn)
            pro.Where.IdProveedor.Value = idProveedor

            If pro.Query.Load Then

                pro.Proveedor = proveedor
                pro.Direccion = direccion
                pro.Telefono1 = telefono1
                pro.Telefono2 = telefono2
                pro.Email = email
                pro.Ruc = ruc
                pro.Habilitado = habilitado
                pro.ActualizadoPor = codUsuario
                pro.ActualizadoFecha = DateTime.Now
                pro.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_Proveedores(ByVal conn As String, ByVal idProveedor As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim pro As New ClassSigeco.ClassSigeco.si_proveedor(conn)
            pro.Where.IdProveedor.Value = idProveedor

            If pro.Query.Load Then

                pro.MarkAsDeleted()
                pro.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Proveedores_All(ByVal conn As String, ByVal idProveedor As Integer, ByVal proveedor As String, _
                                        ByVal ruc As String, ByVal habilitados As Boolean) As DataTable
        Try

            Dim vPro As New ClassSigeco.ClassSigeco.vw_proveedores(conn)

            If idProveedor > 0 Then
                vPro.Where.IdProveedor.Value = idProveedor
            End If

            If proveedor <> "" Then
                vPro.Where.Proveedor.Value = "%" & proveedor & "%"
                vPro.Where.Proveedor.Operator = WhereParameter.Operand.Like
            End If

            If ruc <> "" Then
                vPro.Where.Ruc.Value = "%" & ruc & "%"
                vPro.Where.Ruc.Operator = WhereParameter.Operand.Like
            End If

            If habilitados Then
                vPro.Where.Habilitado.Value = habilitados
            End If

            vPro.Query.AddOrderBy("proveedor", WhereParameter.Dir.ASC)

            If vPro.Query.Load Then
                If vPro.DefaultView.Table.Rows.Count > 0 Then
                    Return vPro.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

#End Region

#Region "Compras"

    Public Function Insert_Compras(ByVal conn As String, ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                   ByVal idProveedor As Integer, ByVal fechaVto As String, _
        ByVal condicion As String, ByVal estado As String, ByVal idOrdeCompra As Integer, _
        ByVal idAdministrador As Integer, ByVal total As Decimal, ByVal saldo As Decimal, ByVal totalIva As Decimal, _
        ByVal idUsuario As Integer) As Integer

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_compra(conn)
            ventas.AddNew()

            ventas.NroComprobante = nroComprobante
            ventas.Fecha = fecha
            ventas.IdProveedor = idProveedor

            If fechaVto <> "" Then
                ventas.FechaVencimiento = DateTime.Parse(fechaVto)
            End If

            ventas.Condicion = condicion
            ventas.Estado = estado

            If idOrdeCompra > 0 Then
                ventas.IdOrdenCompra = idOrdeCompra
            End If

            If idAdministrador > 0 Then
                ventas.IdAdministrador = idAdministrador
            End If

            ventas.TotalFactura = total
            ventas.TotalFacturaIVA = totalIva

            If condicion = "CONTADO" Then
                ventas.TotalFacturaSaldo = 0
            Else
                ventas.TotalFacturaSaldo = ventas.TotalFactura
            End If

            ventas.ActualizadoPor = idUsuario
            ventas.ActualizadoFecha = DateTime.Now

            ventas.Save()

            tx.CommitTransaction()

            Return ventas.IdCompra

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Update_Compras(ByVal conn As String, ByVal idCompra As Integer, _
                                     ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                   ByVal idProveedor As Integer, ByVal fechaVto As String, _
        ByVal condicion As String, ByVal estado As String, ByVal idOrdeCompra As Integer, _
        ByVal idAdministrador As Integer, ByVal total As Decimal, ByVal saldo As Decimal, ByVal totalIva As Decimal, _
        ByVal idUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_compra(conn)
            ventas.Where.IdCompra.Value = idCompra

            If ventas.Query.Load Then

                ventas.NroComprobante = nroComprobante
                ventas.Fecha = fecha
                ventas.IdProveedor = idProveedor

                If fechaVto <> "" Then
                    ventas.FechaVencimiento = DateTime.Parse(fechaVto)
                End If

                ventas.Condicion = condicion
                ventas.Estado = estado

                If idOrdeCompra > 0 Then
                    ventas.IdOrdenCompra = idOrdeCompra
                End If

                If idAdministrador > 0 Then
                    ventas.IdAdministrador = idAdministrador
                End If

                ventas.TotalFactura = total
                ventas.TotalFacturaIVA = totalIva

                If condicion = "CONTADO" Then
                    ventas.TotalFacturaSaldo = 0
                Else
                    ventas.TotalFacturaSaldo = ventas.TotalFactura
                End If

                ventas.ActualizadoPor = idUsuario
                ventas.ActualizadoFecha = DateTime.Now

                ventas.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Update_Compras_Estado(ByVal conn As String, ByVal idCompra As Integer, ByVal estadoCompra As String, ByVal codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim compras As New ClassSigeco.ClassSigeco.si_compra(conn)
            compras.Where.IdCompra.Value = idCompra

            If compras.Query.Load Then
                compras.Estado = estadoCompra
                compras.ActualizadoPor = codUsuario
                compras.ActualizadoFecha = DateTime.Now
                compras.Save()

                If estadoCompra = "ANULADA" Then

                    Dim detalle As New ClassSigeco.ClassSigeco.si_compra_detalle(conn)
                    detalle.Where.IdCompra.Value = idCompra
                    If detalle.Query.Load Then

                        For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                            'Dim producto As New Class_RC_Data.Class_RC.MATERIALES(conn)
                            'producto.Where.CodMaterial.Value = detalle.DefaultView.Table.Rows(i)("CodMaterial")
                            'If producto.Query.Load Then
                            '    producto.CantExistente += detalle.DefaultView.Table.Rows(i)("cantidad")
                            '    producto.CodUsuario = codUsuario
                            '    producto.FechaActualizacion = DateTime.Now
                            '    producto.Save()
                            'End If

                        Next

                    End If

                End If

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_Compras(ByVal conn As String, ByVal idCompra As Integer, ByVal codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim compras As New ClassSigeco.ClassSigeco.si_compra(conn)
            compras.Where.IdCompra.Value = idCompra

            If compras.Query.Load Then

                Dim detalle As New ClassSigeco.ClassSigeco.si_compra_detalle(conn)
                detalle.Where.IdCompra.Value = idCompra
                If detalle.Query.Load Then

                    For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                        'Dim producto As New Class_RC_Data.Class_RC.MATERIALES(conn)
                        'producto.Where.CodMaterial.Value = detalle.DefaultView.Table.Rows(i)("CodMaterial")
                        'If producto.Query.Load Then
                        '    producto.CantExistente += detalle.DefaultView.Table.Rows(i)("cantidad")
                        '    producto.CodUsuario = codUsuario
                        '    producto.FechaActualizacion = DateTime.Now
                        '    producto.Save()
                        'End If

                    Next

                End If

                compras.MarkAsDeleted()
                compras.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Compras_All(ByVal conn As String, ByVal idCompra As Integer, ByVal fechaInicio As DateTime, _
                                   ByVal fechaFin As DateTime, ByVal condicion As String, ByVal proveedor As String, _
                                   ByVal estado As String, ByVal nroFactura As String, ByVal ruc As String, _
                                   ByVal codProveedor As Integer, ByVal conSaldo As Boolean) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_compras(conn)

            If idCompra > 0 Then
                vCompras.Where.IdCompra.Value = idCompra
            End If

            If codProveedor > 0 Then
                vCompras.Where.IdProveedor.Value = codProveedor
            End If

            If nroFactura <> "" Then
                vCompras.Where.NroComprobante.Value = "%" & nroFactura & "%"
                vCompras.Where.NroComprobante.Operator = WhereParameter.Operand.Like
            Else
                vCompras.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vCompras.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vCompras.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            If condicion <> "" Then
                vCompras.Where.Condicion.Value = condicion
            End If

            If estado <> "" Then
                vCompras.Where.Estado.Value = estado
            End If

            If proveedor <> "" Then
                vCompras.Where.Proveedor.Value = "%" + proveedor + "%"
                vCompras.Where.Proveedor.Operator = WhereParameter.Operand.Like
            End If

            If ruc <> "" Then
                vCompras.Where.Ruc.Value = "%" + ruc + "%"
                vCompras.Where.Ruc.Operator = WhereParameter.Operand.Like
            End If

            If conSaldo Then
                vCompras.Where.TotalFacturaSaldo.Value = 0
                vCompras.Where.TotalFacturaSaldo.Operator = WhereParameter.Operand.GreaterThan
            End If

            vCompras.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Compras_ByID(ByVal conn As String, ByVal idCompra As Integer) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_compras(conn)

            If idCompra > 0 Then
                vCompras.Where.IdCompra.Value = idCompra
            End If

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function Insert_Compras_Detalle(ByVal conn As String, ByVal idCompra As Integer, _
                                           ByVal idMercaderia As Integer, ByVal cantidad As Decimal, _
                                            ByVal precio As Decimal, ByVal idImpuesto As Integer, _
                                            ByVal precioFinal As Decimal, ByVal idUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim impuestoMonto As Decimal = 0

            Dim impuesto As New ClassSigeco.ClassSigeco.si_impuesto(conn)
            impuesto.Where.IdImpuesto.Value = idImpuesto

            If impuesto.Query.Load Then

                If impuesto.Valor = 10 Then
                    impuestoMonto = precioFinal / 11
                ElseIf impuesto.Valor = 5 Then
                    impuestoMonto = precioFinal / 21
                ElseIf impuesto.Valor = 0 Then
                    impuestoMonto = 0
                End If

            End If

            Dim detalle As New ClassSigeco.ClassSigeco.si_compra_detalle(conn)

            detalle.AddNew()
            detalle.IdCompra = idCompra
            detalle.IdMercaderia = idMercaderia
            detalle.Cantidad = cantidad
            detalle.Precio = precio
            detalle.IdImpuesto = idImpuesto
            detalle.PrecioFinal = precioFinal
            detalle.MontoImpuesto = impuestoMonto
            detalle.Save()

            Dim venta As New ClassSigeco.ClassSigeco.si_compra(conn)
            venta.Where.IdCompra.Value = idCompra
            If venta.Query.Load Then

                venta.TotalFactura += detalle.PrecioFinal
                venta.TotalFacturaIVA += detalle.MontoImpuesto

                If venta.Condicion = "CREDITO" Then
                    venta.TotalFacturaSaldo += detalle.PrecioFinal
                End If

                venta.ActualizadoPor = idUsuario
                venta.ActualizadoFecha = DateTime.Now
                venta.Save()

            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception

            tx.RollbackTransaction()

            If ex.Message.Contains("ix_mercaderia") Then
                MessageError = New Exception("No puede ingresar la misma mercaderia en una misma compra, favor verifique.")
            Else
                MessageError = ex
            End If

            Return False

        End Try

    End Function

    Public Function Delete_Compras_Detalle(ByVal conn As String, ByVal idCompraDetalle As Integer, _
                                           ByVal codUsuario As Integer, ByVal idCompra As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim detalle As New ClassSigeco.ClassSigeco.si_compra_detalle(conn)

            detalle.Where.IdCompraDetalle.Value = idCompraDetalle

            If detalle.Query.Load Then

                Dim venta As New ClassSigeco.ClassSigeco.si_compra(conn)
                venta.Where.IdCompra.Value = idCompra

                If venta.Query.Load Then
                    venta.TotalFactura -= detalle.PrecioFinal
                    venta.TotalFacturaIVA -= detalle.MontoImpuesto

                    If venta.Condicion = "CREDITO" Then
                        venta.TotalFacturaSaldo -= detalle.PrecioFinal
                    Else
                        venta.TotalFacturaSaldo = 0
                    End If

                    venta.ActualizadoPor = codUsuario
                    venta.ActualizadoFecha = DateTime.Now
                    venta.Save()

                End If

                detalle.MarkAsDeleted()
                detalle.Save()

            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Compras_Detalles_All(ByVal conn As String, ByVal idCompra As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_compras_detalle(conn)

            If idCompra > 0 Then
                vDetalle.Where.IdCompra.Value = idCompra
            End If

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Compras_Detalles_ByID(ByVal conn As String, ByVal idCompraDetalle As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_compras_detalle(conn)

            vDetalle.Where.idCompraDetalle.Value = idCompraDetalle

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

#End Region

#Region "Lotes"

    Public Function Insert_Mercaderia_Lote(ByVal conn As String, ByVal lote As String, ByVal vencimiento As String, ByVal cantidad As Integer, _
                                           ByVal costoUnitario As Decimal, ByVal idDeposito As Integer, ByVal idMercaderia As Integer) As Integer

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
            ventas.AddNew()

            ventas.IdDeposito = idDeposito
            ventas.IdMercaderia = idMercaderia
            ventas.Lote = lote

            If vencimiento <> "" Then
                ventas.Vencimiento = DateTime.Parse(vencimiento)
            End If

            ventas.CostoUnitario = costoUnitario

            ventas.Save()

            tx.CommitTransaction()

            Return ventas.IdMercaderiaLote

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Update_Mercaderia_Lote(ByVal conn As String, ByVal idMercaderiaLote As Integer, _
                                           ByVal lote As String, _
                                           ByVal vencimiento As String, _
                                           ByVal cantidad As Integer, _
                                           ByVal costoUnitario As Decimal, ByVal idDeposito As Integer, _
                                           ByVal idUsuario As Integer, _
                                           ByVal fechaBaja As String, ByVal saldo As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
            ventas.Where.IdMercaderiaLote.Value = idMercaderiaLote

            If ventas.Query.Load Then

                ventas.IdDeposito = idDeposito
                ventas.Lote = lote

                If vencimiento <> "" Then
                    ventas.Vencimiento = DateTime.Parse(vencimiento)
                End If

                If fechaBaja <> "" Then
                    ventas.FechaBaja = DateTime.Parse(fechaBaja)
                End If

                ventas.Saldo = saldo
                ventas.CostoUnitario = costoUnitario

                If idUsuario > 0 Then
                    ventas.IdUsuarioBaja = idUsuario
                End If

                ventas.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_Mercaderia_Lote(ByVal conn As String, ByVal idMercaderiaLote As Integer, _
                                           ByVal codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim compras As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
            compras.Where.IdMercaderiaLote.Value = idMercaderiaLote

            If compras.Query.Load Then

                'Dim detalle As New ClassSigeco.ClassSigeco.si_compra_detalle(conn)
                'detalle.Where.IdCompra.Value = idCompra
                'If detalle.Query.Load Then

                '    For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                '        'Dim producto As New Class_RC_Data.Class_RC.MATERIALES(conn)
                '        'producto.Where.CodMaterial.Value = detalle.DefaultView.Table.Rows(i)("CodMaterial")
                '        'If producto.Query.Load Then
                '        '    producto.CantExistente += detalle.DefaultView.Table.Rows(i)("cantidad")
                '        '    producto.CodUsuario = codUsuario
                '        '    producto.FechaActualizacion = DateTime.Now
                '        '    producto.Save()
                '        'End If

                '    Next

                'End If

                compras.MarkAsDeleted()
                compras.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Mercaderia_Lote_All(ByVal conn As String, ByVal idMercaderia As Integer, ByVal mercaderia As String, ByVal conSaldo As Boolean) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_mercaderias_lotes(conn)

            If idMercaderia > 0 Then
                vCompras.Where.IdMercaderia.Value = idMercaderia
            End If

            If mercaderia <> "" Then
                vCompras.Where.Mercaderia.Value = "%" & mercaderia & "%"
                vCompras.Where.Mercaderia.Operator = WhereParameter.Operand.Like
            Else
                'vCompras.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                'vCompras.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                'vCompras.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            If conSaldo Then
                vCompras.Where.Saldo.Value = 0
                vCompras.Where.Saldo.Operator = WhereParameter.Operand.GreaterThan
            End If

            vCompras.Query.AddOrderBy("mercaderia", WhereParameter.Dir.DESC)

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Mercaderia_ByID(ByVal conn As String, ByVal idMercaderia As Integer) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_mercaderias_lotes(conn)

            If idMercaderia > 0 Then
                vCompras.Where.idMercaderia.Value = idMercaderia
            End If

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

#End Region

#Region "RemisionCompra"

    Public Function Insert_Remision(ByVal conn As String, ByVal nroComprobante As String, ByVal fecha As DateTime, ByVal idVenta As Integer, ByVal idCompra As Integer, ByVal idMotivo As Integer, ByVal estado As String, ByVal actualizadoPor As Integer) As Integer

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_notaRemision(conn)
            ventas.AddNew()
            ventas.NroComprobante = nroComprobante
            ventas.Fecha = fecha

            If idVenta > 0 Then
                ventas.IdVenta = idVenta
            End If

            If idCompra > 0 Then
                ventas.IdCompra = idCompra
            End If

            ventas.IdMotivoStock = idMotivo
            ventas.Estado = estado
            ventas.ActualizadoPor = actualizadoPor
            ventas.ActualizadoFecha = DateTime.Now
            ventas.Save()

            tx.CommitTransaction()

            Return ventas.IdNotaRemision

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Update_Remision(ByVal conn As String, ByVal idNotaRemision As Integer, _
                                           ByVal nroComprobante As String, ByVal fecha As DateTime, ByVal idVenta As Integer, ByVal idCompra As Integer, ByVal idMotivo As Integer, ByVal estado As String, ByVal actualizadoPor As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_notaRemision(conn)
            ventas.Where.IdNotaRemision.Value = idNotaRemision

            If ventas.Query.Load Then

                ventas.NroComprobante = nroComprobante
                ventas.Fecha = fecha

                If idVenta > 0 Then
                    ventas.IdVenta = idVenta
                End If

                If idCompra > 0 Then
                    ventas.IdCompra = idCompra
                End If

                ventas.IdMotivoStock = idMotivo
                ventas.Estado = estado
                ventas.ActualizadoPor = actualizadoPor
                ventas.ActualizadoFecha = DateTime.Now
                ventas.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_Remision(ByVal conn As String, ByVal idNotaRemision As Integer, _
                                           ByVal codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim compras As New ClassSigeco.ClassSigeco.si_notaRemision(conn)
            compras.Where.IdNotaRemision.Value = idNotaRemision

            If compras.Query.Load Then

                Dim detalle As New ClassSigeco.ClassSigeco.si_notaRemision_detalle(conn)
                detalle.Where.IdNotaRemision.Value = idNotaRemision
                If detalle.Query.Load Then

                    For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                        Dim producto As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
                        producto.Where.IdMercaderiaLote.Value = detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote")
                        If producto.Query.Load Then

                            If producto.Cantidad = producto.Saldo Then
                                producto.MarkAsDeleted()
                                producto.Save()
                            Else
                                Throw New Exception("El lote que desea borrar, ya posee movimientos.")
                            End If

                        End If

                    Next

                End If

                compras.MarkAsDeleted()
                compras.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Remision_All(ByVal conn As String, ByVal nroComprobante As String, ByVal fechaInicio As DateTime, ByVal fechaFin As DateTime, _
                                    ByVal nroVenta As String, ByVal nroCompra As String, ByVal idMotivo As Integer, ByVal estado As String) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_notaRemision(conn)

            If nroComprobante <> "" Then
                vCompras.Where.NroComprobante.Value = "%" & nroComprobante & "%"
                vCompras.Where.NroComprobante.Operator = WhereParameter.Operand.Like
            Else
                vCompras.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vCompras.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vCompras.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            If nroVenta <> "" Then
                vCompras.Where.NroVenta.Value = "%" & nroVenta & "%"
                vCompras.Where.NroVenta.Operator = WhereParameter.Operand.Like
            End If

            If nroCompra <> "" Then
                vCompras.Where.NroCompra.Value = "%" & nroCompra & "%"
                vCompras.Where.NroCompra.Operator = WhereParameter.Operand.Like
            End If

            If estado <> "" Then
                vCompras.Where.Estado.Value = "%" & estado & "%"
                vCompras.Where.Estado.Operator = WhereParameter.Operand.Like
            End If

            If idMotivo > 0 Then
                vCompras.Where.IdMotivoStock.Value = idMotivo
            End If

            vCompras.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)
            vCompras.Query.AddOrderBy("idNotaRemision", WhereParameter.Dir.DESC)

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Remision_ByID(ByVal conn As String, ByVal idRemision As Integer) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_notaRemision(conn)

            If idRemision > 0 Then
                vCompras.Where.IdNotaRemision.Value = idRemision
            End If

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function Insert_NotasRemision_Detalle(ByVal conn As String, ByVal idNotaRemision As Integer, _
                                                 ByVal idMercaderias As Integer, ByVal cantidad As Integer, _
                                                 ByVal lote As String, ByVal vto As String, ByVal idDeposito As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim mercaderiaLote As New si_mercaderiaLote(conn)
            mercaderiaLote.AddNew()
            mercaderiaLote.IdMercaderia = idMercaderias
            mercaderiaLote.Lote = lote
            If vto <> "" Then
                mercaderiaLote.Vencimiento = DateTime.Parse(vto)
            End If
            mercaderiaLote.IdDeposito = idDeposito
            mercaderiaLote.Cantidad = cantidad
            mercaderiaLote.Saldo = cantidad
            mercaderiaLote.Save()

            If mercaderiaLote.IdMercaderiaLote > 0 Then
                Dim detalle As New ClassSigeco.ClassSigeco.si_notaRemision_detalle(conn)
                detalle.AddNew()
                detalle.IdNotaRemision = idNotaRemision
                detalle.IdMercaderia = idMercaderias
                detalle.Cantidad = cantidad
                detalle.IdMercaderiaLote = mercaderiaLote.IdMercaderiaLote
                detalle.Save()
            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception

            tx.RollbackTransaction()

            If ex.Message.Contains("ix_mercaderia") Then
                MessageError = New Exception("No puede ingresar la misma mercaderia en una misma compra, favor verifique.")
            Else
                MessageError = ex
            End If

            Return False

        End Try

    End Function

    Public Function Delete_NotasRemision_Detalle(ByVal conn As String, ByVal idNotaRemisionDetalle As Integer, _
                                           ByVal codUsuario As Integer, ByVal idNotaRemision As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim detalle As New ClassSigeco.ClassSigeco.si_notaRemision_detalle(conn)
            detalle.Where.IdNotaRemisionDetalle.Value = idNotaRemisionDetalle
            If detalle.Query.Load Then

                Dim venta As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
                venta.Where.IdMercaderiaLote.Value = detalle.IdMercaderiaLote

                If venta.Query.Load Then

                    If venta.Cantidad = venta.Saldo Then
                        venta.MarkAsDeleted()
                        venta.Save()
                    Else
                        Throw New Exception("El lote que desea borrar, ya posee movimientos.")
                    End If

                End If

                detalle.MarkAsDeleted()
                detalle.Save()

            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_NotasRemision_Detalles_All(ByVal conn As String, ByVal idNotaRemision As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_notaRemision_detalle(conn)

            If idNotaRemision > 0 Then
                vDetalle.Where.IdNotaRemision.Value = idNotaRemision
            End If

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_NotasRemision_Detalles_ByID(ByVal conn As String, ByVal idNotaRemisionDetalle As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_notaRemision_detalle(conn)

            vDetalle.Where.IdNotaRemisionDetalle.Value = idNotaRemisionDetalle

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function


#End Region

End Class
